Prereq: "7.4p2"
*** ../tcl7.4p2/patchlevel.h	Mon Sep 18 11:41:25 1995
--- patchlevel.h	Mon Nov 27 08:57:48 1995
***************
*** 17,23 ****
   * See the file "license.terms" for information on usage and redistribution
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   *
!  * @(#) patchlevel.h 1.11 95/09/18 11:41:22
   */
  
! #define TCL_PATCH_LEVEL "7.4p2"
--- 17,23 ----
   * See the file "license.terms" for information on usage and redistribution
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   *
!  * @(#) patchlevel.h 1.12 95/11/27 08:57:52
   */
  
! #define TCL_PATCH_LEVEL "7.4p3"
*** ../tcl7.4p2/./tclCkalloc.c	Mon Jun 19 10:33:12 1995
--- ./tclCkalloc.c	Wed Sep 20 16:43:25 1995
***************
*** 14,20 ****
   *
   */
  
! static char sccsid[] = "@(#) tclCkalloc.c 1.9 95/06/19 10:33:11";
  
  #include "tclInt.h"
  
--- 14,20 ----
   *
   */
  
! static char sccsid[] = "@(#) tclCkalloc.c 1.10 95/09/20 16:43:24";
  
  #include "tclInt.h"
  
***************
*** 393,399 ****
       * even though BODY_OFFSET is in words on these machines).
       */
  
!     struct mem_header *memp = (struct mem_header *) \
  	    (((unsigned long) ptr) - BODY_OFFSET);
  
      if (alloc_tracing)
--- 393,399 ----
       * even though BODY_OFFSET is in words on these machines).
       */
  
!     struct mem_header *memp = (struct mem_header *)
  	    (((unsigned long) ptr) - BODY_OFFSET);
  
      if (alloc_tracing)
***************
*** 459,465 ****
       * line.
       */
  
!     struct mem_header *memp = (struct mem_header *) \
  	    (((unsigned long) ptr) - BODY_OFFSET);
  
      copySize = size;
--- 459,465 ----
       * line.
       */
  
!     struct mem_header *memp = (struct mem_header *)
  	    (((unsigned long) ptr) - BODY_OFFSET);
  
      copySize = size;
*** ../tcl7.4p2/./tclCmdAH.c	Fri May  5 09:29:51 1995
--- ./tclCmdAH.c	Wed Sep 27 11:11:26 1995
***************
*** 12,18 ****
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclCmdAH.c 1.98 95/05/05 09:29:51";
  
  #include "tclInt.h"
  #include "tclPort.h"
--- 12,18 ----
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclCmdAH.c 1.99 95/09/27 11:11:24";
  
  #include "tclInt.h"
  #include "tclPort.h"
***************
*** 775,780 ****
--- 775,791 ----
  	    }
  	    argIndex++;
  	    format++;
+ 	}
+ 	if (width > 1000) {
+ 	    /*
+ 	     * Don't allow arbitrarily large widths:  could cause core
+ 	     * dump when we try to allocate a zillion bytes of memory
+ 	     * below.
+ 	     */
+ 
+ 	    width = 1000;
+ 	} else if (width < 0) {
+ 	    width = 0;
  	}
  	if (width != 0) {
  	    sprintf(newPtr, "%d", width);
*** ../tcl7.4p2/./tclMain.c	Thu Jun  8 10:55:57 1995
--- ./tclMain.c	Wed Sep 27 15:32:02 1995
***************
*** 11,17 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#) tclMain.c 1.21 95/06/08 10:55:55";
  #endif
  
  #include <stdio.h>
--- 11,17 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#) tclMain.c 1.22 95/09/27 15:32:01";
  #endif
  
  #include <stdio.h>
***************
*** 230,236 ****
  	if (code != TCL_OK) {
  	    fprintf(stderr, "%s\n", interp->result);
  	} else if (tty && (*interp->result != 0)) {
! 	    printf("%s\n", interp->result);
  	}
  #ifdef TCL_MEM_DEBUG
  	if (quitFlag) {
--- 230,242 ----
  	if (code != TCL_OK) {
  	    fprintf(stderr, "%s\n", interp->result);
  	} else if (tty && (*interp->result != 0)) {
! 	    /*
! 	     * Important:  use puts and not printf here.  On Solaris 2.3
! 	     * and 2.4, and perhaps other systems, printf will dump core
! 	     * if interp->result is big.
! 	     */
! 
! 	    puts(interp->result);
  	}
  #ifdef TCL_MEM_DEBUG
  	if (quitFlag) {
*** ../tcl7.4p2/./tclUnixAZ.c	Thu Jun 29 14:22:40 1995
--- ./tclUnixAZ.c	Fri Nov 17 15:40:14 1995
***************
*** 14,20 ****
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclUnixAZ.c 1.85 95/06/29 14:22:37";
  
  #include "tclInt.h"
  #include "tclPort.h"
--- 14,20 ----
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclUnixAZ.c 1.87 95/11/17 15:40:14";
  
  #include "tclInt.h"
  #include "tclPort.h"
***************
*** 783,804 ****
  {
      char string[30];
  
!     sprintf(string, "%ld", statPtr->st_dev);
      if (Tcl_SetVar2(interp, varName, "dev", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_ino);
      if (Tcl_SetVar2(interp, varName, "ino", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_mode);
      if (Tcl_SetVar2(interp, varName, "mode", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_nlink);
      if (Tcl_SetVar2(interp, varName, "nlink", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
--- 783,804 ----
  {
      char string[30];
  
!     sprintf(string, "%ld", (long) statPtr->st_dev);
      if (Tcl_SetVar2(interp, varName, "dev", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_ino);
      if (Tcl_SetVar2(interp, varName, "ino", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_mode);
      if (Tcl_SetVar2(interp, varName, "mode", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_nlink);
      if (Tcl_SetVar2(interp, varName, "nlink", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
***************
*** 813,834 ****
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_size);
      if (Tcl_SetVar2(interp, varName, "size", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_atime);
      if (Tcl_SetVar2(interp, varName, "atime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_mtime);
      if (Tcl_SetVar2(interp, varName, "mtime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", statPtr->st_ctime);
      if (Tcl_SetVar2(interp, varName, "ctime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
--- 813,834 ----
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_size);
      if (Tcl_SetVar2(interp, varName, "size", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_atime);
      if (Tcl_SetVar2(interp, varName, "atime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_mtime);
      if (Tcl_SetVar2(interp, varName, "mtime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
      }
!     sprintf(string, "%ld", (long) statPtr->st_ctime);
      if (Tcl_SetVar2(interp, varName, "ctime", string, TCL_LEAVE_ERR_MSG)
  	    == NULL) {
  	return TCL_ERROR;
***************
*** 1806,1812 ****
  {
      int count, i, result;
      double timePer;
! #if NO_GETTOD
      struct tms dummy2;
      long start, stop;
  #else
--- 1806,1812 ----
  {
      int count, i, result;
      double timePer;
! #ifdef NO_GETTOD
      struct tms dummy2;
      long start, stop;
  #else
***************
*** 1826,1832 ****
  		" command ?count?\"", (char *) NULL);
  	return TCL_ERROR;
      }
! #if NO_GETTOD
      start = times(&dummy2);
  #else
      gettimeofday(&start, &tz);
--- 1826,1832 ----
  		" command ?count?\"", (char *) NULL);
  	return TCL_ERROR;
      }
! #ifdef NO_GETTOD
      start = times(&dummy2);
  #else
      gettimeofday(&start, &tz);
***************
*** 1843,1849 ****
  	    return result;
  	}
      }
! #if NO_GETTOD
      stop = times(&dummy2);
      timePer = (((double) (stop - start))*1000000.0)/CLK_TCK;
  #else
--- 1843,1849 ----
  	    return result;
  	}
      }
! #ifdef NO_GETTOD
      stop = times(&dummy2);
      timePer = (((double) (stop - start))*1000000.0)/CLK_TCK;
  #else
***************
*** 1892,1898 ****
  				 * newline. */
  {
      int result = TCL_OK;
!     int i, pid, length, abnormalExit;
      WAIT_STATUS_TYPE waitStatus;
      char *msg;
  
--- 1892,1898 ----
  				 * newline. */
  {
      int result = TCL_OK;
!     int i, pid, length, abnormalExit, anyErrorInfo;
      WAIT_STATUS_TYPE waitStatus;
      char *msg;
  
***************
*** 1964,1969 ****
--- 1964,1970 ----
       * string.
       */
  
+     anyErrorInfo = 0;
      if (errorId >= 0) {
  	while (1) {
  #	    define BUFFER_SIZE 1000
***************
*** 1984,1989 ****
--- 1985,1991 ----
  	    }
  	    buffer[count] = 0;
  	    Tcl_AppendResult(interp, buffer, (char *) NULL);
+ 	    anyErrorInfo = 1;
  	}
  	close(errorId);
      }
***************
*** 1993,1999 ****
       * at all, generate an error message here.
       */
  
!     if (abnormalExit && (*interp->result == 0)) {
  	Tcl_AppendResult(interp, "child process exited abnormally",
  		(char *) NULL);
      }
--- 1995,2001 ----
       * at all, generate an error message here.
       */
  
!     if (abnormalExit && !anyErrorInfo) {
  	Tcl_AppendResult(interp, "child process exited abnormally",
  		(char *) NULL);
      }
*** ../tcl7.4p2/./tclUnixStr.c	Thu Jun 29 08:21:26 1995
--- ./tclUnixStr.c	Fri Nov  3 10:59:34 1995
***************
*** 13,19 ****
   */
  
  #ifndef lint
! static char sccsid[] = "@(#) tclUnixStr.c 1.24 95/06/29 08:21:25";
  #endif /* not lint */
  
  #include "tclInt.h"
--- 13,19 ----
   */
  
  #ifndef lint
! static char sccsid[] = "@(#) tclUnixStr.c 1.25 95/11/03 10:59:35";
  #endif /* not lint */
  
  #include "tclInt.h"
***************
*** 215,221 ****
  #ifdef ELNRNG
  	case ELNRNG: return "ELNRNG";
  #endif
! #ifdef ELOOP
  	case ELOOP: return "ELOOP";
  #endif
  #ifdef EMFILE
--- 215,221 ----
  #ifdef ELNRNG
  	case ELNRNG: return "ELNRNG";
  #endif
! #if defined(ELOOP) && (!defined(ENOENT) || (ELOOP != ENOENT))
  	case ELOOP: return "ELOOP";
  #endif
  #ifdef EMFILE
*** ../tcl7.4p2/./tclUnixUtil.c	Mon Aug 28 08:57:36 1995
--- ./tclUnixUtil.c	Mon Nov 13 14:17:46 1995
***************
*** 16,22 ****
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclUnixUtil.c 1.57 95/08/28 08:57:37";
  
  #include "tclInt.h"
  #include "tclPort.h"
--- 16,22 ----
   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
   */
  
! static char sccsid[] = "@(#) tclUnixUtil.c 1.58 95/11/13 14:17:50";
  
  #include "tclInt.h"
  #include "tclPort.h"
***************
*** 218,224 ****
      int status, result;
  
      for (detPtr = detList, prevPtr = NULL; detPtr != NULL; ) {
! 	result = waitpid(detPtr->pid, &status, WNOHANG);
  	if ((result == 0) || ((result == -1) && (errno != ECHILD))) {
  	    prevPtr = detPtr;
  	    detPtr = detPtr->nextPtr;
--- 218,224 ----
      int status, result;
  
      for (detPtr = detList, prevPtr = NULL; detPtr != NULL; ) {
! 	result = (int) waitpid((pid_t) detPtr->pid, &status, WNOHANG);
  	if ((result == 0) || ((result == -1) && (errno != ECHILD))) {
  	    prevPtr = detPtr;
  	    detPtr = detPtr->nextPtr;
***************
*** 1427,1433 ****
  {
      int result;
      while (1) {
! 	result = waitpid(pid, statPtr, options);
  	if ((result != -1) || (errno != EINTR)) {
  	    return result;
  	}
--- 1427,1433 ----
  {
      int result;
      while (1) {
! 	result = (int) waitpid((pid_t) pid, statPtr, options);
  	if ((result != -1) || (errno != EINTR)) {
  	    return result;
  	}
*** ../tcl7.4p2/./changes	Mon Sep 18 11:04:09 1995
--- ./changes	Mon Nov 27 08:57:58 1995
***************
*** 1,6 ****
  Recent user-visible changes to Tcl:
  
! sccsid = @(#) changes 1.16 95/09/18 11:04:07
  
  1. No more [command1] [command2] construct for grouping multiple
  commands on a single command line.
--- 1,6 ----
  Recent user-visible changes to Tcl:
  
! sccsid = @(#) changes 1.17 95/11/27 08:58:02
  
  1. No more [command1] [command2] construct for grouping multiple
  commands on a single command line.
***************
*** 1245,1251 ****
  
  8/4/95 (bug fix) C-level trace callbacks for variables were sometimes
  receiving the PART1_NOT_PARSED flag, which could cause errors in
! subsequent Tcl library calls using the flags.
  
  8/4/95 (bug fix) Calls to toupper and tolower weren't using the
  UCHAR macros, which caused trouble in non-U.S. locales. (JO)
--- 1245,1251 ----
  
  8/4/95 (bug fix) C-level trace callbacks for variables were sometimes
  receiving the PART1_NOT_PARSED flag, which could cause errors in
! subsequent Tcl library calls using the flags. (JO)
  
  8/4/95 (bug fix) Calls to toupper and tolower weren't using the
  UCHAR macros, which caused trouble in non-U.S. locales. (JO)
***************
*** 1252,1260 ****
  
  8/25/95 (bug fix) Undid change from 7/19, so that commands can stay
  around while their deletion callbacks execute.  Added lots of code to
! handle all of the reentrancy problems that this opens up.
  
  8/28/95 (bug fix) Exec wasn't handling bad user names properly, as
! in "exec ~bogus_user/foo".
  
  ----------------- Released patch 7.4p2, 9/19/95 -----------------------
--- 1252,1273 ----
  
  8/25/95 (bug fix) Undid change from 7/19, so that commands can stay
  around while their deletion callbacks execute.  Added lots of code to
! handle all of the reentrancy problems that this opens up. (JO)
  
  8/28/95 (bug fix) Exec wasn't handling bad user names properly, as
! in "exec ~bogus_user/foo". (JO)
  
  ----------------- Released patch 7.4p2, 9/19/95 -----------------------
+ 
+ 9/27/95 (bug fix) The "format" command didn't check for huge or negative
+ width specifiers, which could cause core dumps. (JO)
+ 
+ 9/27/95 (bug fix) Core dumps could occur if an interactive command typed
+ to tclsh returned a very long result for tclsh to print out.  The bug is
+ actually in printf (in Solaris 2.3 and 2.4, at least);  switched to use
+ puts instead.  (JO)
+ 
+ 10/1/95 (bug fix) "exec" command wasn't always generating the
+ "child process exited abnormally" message when it should have.  (JO)
+ 
+ ----------------- Released patch 7.4p3, 12/28/95 -----------------------
*** ../tcl7.4p2/./tests/lsort.test	Mon Jun  5 17:00:02 1995
--- ./tests/lsort.test	Mon Oct 30 08:03:20 1995
***************
*** 10,16 ****
  # See the file "license.terms" for information on usage and redistribution
  # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  #
! # @(#) lsort.test 1.6 95/06/05 17:00:02
  
  if {[string compare test [info procs test]] == 1} then {source defs}
  
--- 10,16 ----
  # See the file "license.terms" for information on usage and redistribution
  # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  #
! # @(#) lsort.test 1.7 95/10/30 08:03:22
  
  if {[string compare test [info procs test]] == 1} then {source defs}
  
***************
*** 122,134 ****
  } {1 {bad switch "-in": must be -ascii, -integer, -real, -increasing -decreasing, or -command}}
  test lsort-5.5 {lsort errors: disallow recursion} {
      proc x args {lsort {a b c}}
!     list [catch {lsort -command x {3 7}} msg] $msg $errorInfo
! } {1 {can't invoke "lsort" recursively} {can't invoke "lsort" recursively
!     while executing
! "lsort {a b c}"
!     (procedure "x" line 1)
!     invoked from within
! "x 3 7"
!     (user-defined comparison command)
!     invoked from within
! "lsort -command x {3 7}"}}
--- 122,126 ----
  } {1 {bad switch "-in": must be -ascii, -integer, -real, -increasing -decreasing, or -command}}
  test lsort-5.5 {lsort errors: disallow recursion} {
      proc x args {lsort {a b c}}
!     list [catch {lsort -command x {3 7}} msg] $msg
! } {1 {can't invoke "lsort" recursively}}
